package com.fanqj.resilience4j.controller;

import io.github.resilience4j.core.IntervalFunction;
import io.github.resilience4j.retry.RetryConfig;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.xml.ws.WebServiceException;
import java.io.IOException;
import java.time.Duration;
import java.util.concurrent.TimeoutException;

/**
 * 重试
 * @author <a href="mailto:fanqijin@wxchina.com">fanqj</a>
 * @Date 2021年01月27日 11:12
 * @Version 6.4.1
 */
@RestController
@RequestMapping("retry")
public class RetryController {

    private void init() {
        RetryConfig retryConfig = RetryConfig.custom()
                //最大重试次数, 默认3
                .maxAttempts(2)
                //两次重试之间的时间间隔， 默认500ms
                .waitDuration(Duration.ofMillis(1000))
                //配置用于计算是否应重试的断言。如果要重试，断言必须返回true，否则返回false。
                .retryOnResult(response -> response.equals(500))
                //判断某个异常发生时，是否要进行重试。如果要重试，断言必须返回true，否则必须返回false。
                .retryOnException(e -> e instanceof WebServiceException)
                //需要进行重试的异常类型，支持子类型。
                .retryExceptions(IOException.class, TimeoutException.class)
                //忽略重试的一场类型，支持子类型
                .ignoreExceptions(null)
                .build();

        //默认时间间隔
        IntervalFunction defaultWaitInterval = IntervalFunction
                .ofDefaults();
        // 当您只配置waitDuration时,此间隔函数在内部使用。
        IntervalFunction fixedWaitInterval = IntervalFunction
                .of(Duration.ofSeconds(5));
        //指数增长，1.5倍
        IntervalFunction intervalWithExponentialBackoff = IntervalFunction
                .ofExponentialBackoff();
        //自定义指数 增长
        IntervalFunction intervalWithCustomExponentialBackoff = IntervalFunction
                .ofExponentialBackoff(IntervalFunction.DEFAULT_INITIAL_INTERVAL, 2d);
        //随机
        IntervalFunction randomWaitInterval = IntervalFunction
                .ofRandomized();
        // 用自定义的intervalFunction覆盖默认的intervalFunction
         retryConfig = RetryConfig.custom()
                .intervalFunction(intervalWithExponentialBackoff)
                .build();
    }
}
